package helper

import (
	"bytes"
	log "github.com/sirupsen/logrus"
	"os"
	"path/filepath"
)

//FirstLetterToUpper 字符串首字母转换为大写
func FirstLetterToUpper(s string) string {
	firstLetter := s[0:1]
	firstLetterUpper := bytes.ToUpper([]byte(firstLetter))

	return string(firstLetterUpper) + s[1:]
}

// FileExist 检查文件或目录是否存在
//如果由 filename 指定的文件或目录存在则返回 true，否则返回 false
func FileExist(filename string) bool {
	_, err := os.Stat(filename)
	return err == nil || os.IsExist(err)
}

// GetFilePath 获取文件的路径
// 因为go的特性，go run，go build，go test会有不同的临时目录，那么os.Args[0]会获取到不同的值，为了适应不同的编译环境，所以需要多种判断方式
// 思路来源于beego源码
// https://github.com/astaxie/beego/blob/master/config.go#L133-L146
func GetFilePath(filename string) string {
	appPath, err := filepath.Abs(filepath.Dir(os.Args[0]))
	if err != nil {
		panic(err)
	}

	workPath, err := os.Getwd()
	if err != nil {
		panic(err)
	}

	var filePath string

	appConfigPath := filepath.Join(appPath, filename)
	if !FileExist(appConfigPath) {
		workConfigPath := filepath.Join(workPath, filename)
		if !FileExist(workConfigPath) {
			log.Info("[filesystem]appConfigPath" + appConfigPath)
			log.Info("[filesystem]workConfigPath" + workConfigPath)
			panic("[filesystem]无法获取配置文件")
		} else {
			filePath = workConfigPath
		}
	} else {
		filePath = appConfigPath
	}

	return filePath
}
